package modelo;
//import javabeans.*;
import java.sql.*;
import java.sql.SQLException;
import org.apache.struts.action.*;
import modelo.beans.*;
import java.sql.ResultSet;
import java.sql.Statement;
import beans.auxiliares.compra;
import beans.auxiliares.suscripcion;
import java.sql.Connection;
import java.util.*;
/**
 *
 * @author javier
 */
public class GestionClientes {
     DatosConexion dt;
     String name;
     ResultSet rs=null;
     Statement st=null;
    
  public GestionClientes(){
      super();
      dt= new DatosConexion();
      st=dt.cogerStatement();
  }
     
    /*métodos de la clase que gestiona las funciones de los clientes*/
    
   
    
    public String validar (ClienteBean cb) throws SQLException {
       
        String estado="no";
        String nombre = cb.getNombre();
        String contrasena=cb.getContrasena();
        
        try{
           
           String query="select perfil from clientes where nombre='"+nombre+"'"+"and contrasena='"+contrasena+"'";
           
           rs=st.executeQuery(query); 
          
           if (rs.next()){               
               estado =rs.getString("perfil");
           }
           else{
              estado ="no";
           }
      
        }
           
        catch (SQLException e){
            
        }
        return estado;
    }
    
        
    public boolean cambiarContrasena(ClienteBean cb)throws SQLException{
           
           boolean estado=false;
    
       String nuevacontrasena=cb.getNuevacontrasena();
       String nombre =cb.getNombre();
       String contrasena=cb.getContrasena();
      
        
        try{
                       
           String query="update clientes set contrasena='"+nuevacontrasena+"'where nombre='"+nombre+"' and contrasena='"+contrasena+"'";
        
           int i=st.executeUpdate(query);   
            
           if (i==1){
               
               estado =true;
           }
           else{
               estado =false;
           }
           }
           
        catch (SQLException e){
            
        }
        return estado;
           
       }
    
    public String estadocliente (int idpersona)throws SQLException{
        String estado= "inactivo";
        try{
            String query="select estado from clientes where idpersona="+idpersona;
            rs=st.executeQuery(query);
            estado=rs.getString("estado");
        }
        catch (Exception e){
            System.out.println(e);
        }
        return estado;
    }
    
    public boolean existenombre (String idcliente) throws SQLException{
        boolean existe=true;
        try{
            String query="select nombre from clientes where nombre='"+idcliente+"'";
            rs=st.executeQuery(query);
            existe=rs.next();
            
        }
        catch (Exception e){
            System.out.println(e);
        }
        return existe;
        
    }
    
    public String comprar (ClienteBean cb) throws SQLException{
        /*Este método graba las compras que realiza un cliente
         Previo a la grabación del pedido, comprueba que hay plazas*/
        String dev="error";
        try{
            int idcliente=Integer.parseInt(cb.getIdpersona());
            String tipocliente=estadocliente(idcliente);
            if(tipocliente.equals("inactivo")){return "inactivo";}
            int idoferta = Integer.parseInt(cb.getIdoferta());
            int plazascompradas = Integer.parseInt(cb.getPlazascompradas());
            int valortransaccion= Integer.parseInt(cb.getValortransaccion());
            java.util.Date fechatransaccion = new java.util.Date();
            
            String SQL;
            SQL="INSERT INTO transacciones (idoferta, idcliente, plazascompradas, valortransaccion, fechatransaccion) VALUES";
            SQL=SQL+"("+idoferta+","+idcliente+","+plazascompradas+","+valortransaccion+","+fechatransaccion+")";
            dev=comprobaroferta(idoferta, plazascompradas);
            
            if(dev.equalsIgnoreCase("ok")){
                int i= st.executeUpdate(SQL);
                if(i==1){dev="error_grabando";}
            
            }
        }
        catch (Exception et){
            
        }
        
        return dev;
    }
    
    public String comprobaroferta (int idoferta, int plazascompradas) throws SQLException{
        /*Este método comprueba que la oferta está en los plazos indicados y que quedan plazas disponibles*/
        String estado="no-oferta";
        try{
        String Query = "SELECT idoferta, fechafin, fechainicio, plazas, FROM OFERTAS WHERE idoferta="+idoferta;
        
        rs=st.executeQuery(Query);
        java.util.Date hoy= new java.util.Date();
        GregorianCalendar gchoy = new GregorianCalendar ();
        gchoy.setGregorianChange(hoy);
        
        GregorianCalendar finico= new GregorianCalendar();
        finico.setGregorianChange(rs.getDate("fechainicio"));
        
        GregorianCalendar ffin= new GregorianCalendar();
        ffin.setGregorianChange(rs.getDate("fechafin"));
        
        int plazaslimite = rs.getInt("plazas");
        
        String query2="SELECT SUM (plazascompradas) FROM TRANSACCIONES";
        rs=st.executeQuery(name);
        int plazascontratadas = rs.getInt("plazascompradas");
        
        if(finico.compareTo(gchoy)<=0 && ffin.compareTo(gchoy)>=0 && plazaslimite>=plazascontratadas+plazascompradas){
            estado="ok";
        }
        else{ estado="no-oferta";}
        }
        catch (Exception e){
            estado="error";
        }
        return estado;
    }
    
    public ClienteBean listacompravigente (ClienteBean cb) throws SQLException{
      /*extae de la bbdd las ofertas que aún no ha consumido el cliente
       El cliente puede estar activo o inactivo*/  
        String nombre=cb.getNombre();
        java.util.Date hoy = new java.util.Date();
        String sql="select idtransaccion, idoferta, tipooferta,subtipooferta, plazascompradas, valortransaccion, fechatransaccion, fechafin";
        sql=sql+"from transacciones,ofertas";
        sql=sql+"INNER JOIN ofertas, clientes ON tansacciones.idoferta=ofertas.idoferta AND transacciones.idcliente=clientes.idcliente";
        sql=sql+"where "+hoy+"<=fechafin AND '"+nombre+"'=clientes.nombre";
        try{
          rs=st.executeQuery(sql);
          
          ArrayList <compra> listacompra=new ArrayList();
          while(rs.next()){
              compra lacompra = new compra();
              lacompra.setNoferta(String.valueOf(rs.getInt("idoferta")));
              lacompra.setNoperacion(String.valueOf(rs.getInt("idtransaccion")));
              
              lacompra.setTipotransaccion(String.valueOf(rs.getInt("tipooferta")));
              lacompra.setPlazas_compradas(String.valueOf(rs.getInt("plazascompradas")));
              lacompra.setValor_compra(String.valueOf(rs.getInt("valortransaccion")));
              
              GregorianCalendar gc = new GregorianCalendar();
              java.util.Date fecha;
              fecha=rs.getDate("fechatransaccion");
              gc.setGregorianChange(fecha);
              lacompra.setFecha_transaccion(gc);
              
              listacompra.add(lacompra);
              
          }
          int idt;
          String sql1;
          /*revisamos ahora las devoluciones de esa transacción,
             - mostraremos las plazas devueltas
             - si se han devuleto todas las plazas, no mostramos esa fila*/
          for (int i=0;i<listacompra.size();i++){
              
              idt=Integer.parseInt(listacompra.get(i).getNoperacion());
              sql1 = "select idtransaccion, cantidad from devoluciones where idtransaccion="+idt;
              rs=st.executeQuery(sql1);
              while(rs.next()){
                  int cantidadcomprada =Integer.parseInt(listacompra.get(i).getPlazas_compradas());
                  int catidaddevuelta=rs.getInt("cantidad");
                  
                  if(cantidadcomprada<=catidaddevuelta){
                      listacompra.remove(i);
                  }
                  else
                  {
                      String diferencia=null;
                      listacompra.get(i).setPlazas_compradas(diferencia.valueOf(catidaddevuelta));
                  }            
              }
          }
            
          cb.setCompras(listacompra);
        }
        catch (Exception e){
            
        }
        
        return cb;
    }
    
    public String devolverproducto (ClienteBean cb) throws SQLException{
        
        String estado = "error";
        String devolucion_idtransaccion=cb.getDevolucion_idtransaccion();
        
        int devolucion_cantidad = Integer.parseInt(cb.getDevolucion_cantidad());
        java.util.Date hoy = new java.util.Date();
        String SQL;
        SQL="INSERT INTO devoluciones (idtransaccion, cantidad, fechadevolucion) VALUES";
        SQL=SQL+"('"+devolucion_idtransaccion+"',"+devolucion_cantidad+","+hoy+")";
        try{
            int i=st.executeUpdate(SQL); 
            if (i==1){estado="ok";}
        }
        catch (Exception e){
            
        }
        
        return estado;
    }
    
    public String suscribirse (ClienteBean cb) throws SQLException{
        String estado="error";
        try{
            int idcliente, tipooferta, subtipooferta;
            java.util.Date fechadevolucion= new java.util.Date();
            
            idcliente=Integer.parseInt(cb.getIdpersona());
            tipooferta=Integer.parseInt(cb.getTipooferta());
            subtipooferta=Integer.parseInt(cb.getSubtipooferta());
            
            String sql;
            sql="INSERT INTO suscripciones (idcliente, tipooferta, subtipooferta, fechadevolucion) VALUES ";
            sql=sql+"("+idcliente+","+tipooferta+","+subtipooferta+","+fechadevolucion+")";
            
            int i=st.executeUpdate(sql);
            
            if(i==1){estado="ok";}
            
        }
        catch (Exception e){
            
        }
        
        return estado;
    }
   
    public String borrar_suscripcion (ClienteBean cb) throws SQLException{
        String estado="no_borrado";
        int idsuscripcion=Integer.parseInt(cb.getIdsuscripcioneliminar());
        
        try{
            String sql="DELETE FROM SUSCRIPCIONES WHERE idsuscripcion="+idsuscripcion;
            if(st.executeUpdate(sql)==1){estado="borrado";}
            
        }
        catch (Exception e){
            
        }
        return estado;
    }

}
